package com.example.pro3_reactor;

import reactor.core.publisher.Flux;

/**
 * @program: reactivePro
 * @description:
 * @author: zy
 * @create: 2025-04-26 21:26
 */
public class App8_otherMethods {
    public static void main(String[] args) {

        //Flux的zip、mergeWith、concatWith：
        // 将多个Flux合并为一个Flux
        Flux.zip(Flux.just("Hello"), Flux.just("World"))
                .subscribe(tuple -> System.out.println(tuple.getT1() + " " + tuple.getT2()));
        System.out.println("=======================================");
// 输出Hello World
// 将多个Flux合并为一个Flux
        Flux.just("Hello").mergeWith(Flux.just("World")).subscribe(System.out::println);
        System.out.println("=======================================");
//  输出Hello World
// 将多个Flux合并为一个Flux
        Flux.just("Hello").concatWith(Flux.just("World")).subscribe(System.out::println);
        System.out.println("=======================================");
// 区别：
// zip 会将多个Flux的元素按照一对一的方式进行合并，形成一个包含元组的Flux，每个元组中包含了每个源Flux的一个元素。
//     如果源Flux的元素个数不一致，那么zip会以最短的Flux为基准，多余的元素会被丢弃。
// mergeWith 会将多个Flux的元素按照时间顺序进行合并，形成一个包含所有元素的Flux。
//     如果源Flux的元素有重叠，那么mergeWith会保留所有的元素。
// concatWith 会将多个Flux的元素按照订阅顺序进行合并，形成一个包含所有元素的Flux。如果源Flux的元素有重叠，
//     那么concatWith会保留所有的元素。concatWith会等待上一个源Flux完成后才订阅下一个源Flux。


        //累积操作：
        // 对流中包含的所有元素进行累积操作，得到一个包含计算结果的 Mono 序列。
// 在操作时可以指定一个初始值。如果没有初始值，则序列的第一个元素作为初始值。
        Flux.range(1,3)   // 1,2,3
                .reduce((x, y) -> x + y)
                .subscribe(System.out::println);
        Flux.range(1,3)
                .reduceWith(()->10,(x,y)->x + y)
                .subscribe(System.out::println);
    }
}
